// 专门对axios进行二次封装
import { getUserTempId } from "@/utils";
import axios from "axios";
import Nprogress from "nprogress";
import "nprogress/nprogress.css";
import store from "@/store";
// 最终达到的效果
// ​	配置基础路径和超时限制
// ​	添加进度条信息  nprogress
// ​	返回的响应不再需要从data属性当中拿数据，而是响应就是我们要的数据
// ​	统一处理请求错误

// 创建axios实例(ajax) 之后都是用ajax发送请求 玩法都一模一样
const ajax = axios.create({
  baseURL: "/api", //基础路径
  timeout: 20000, //超时时间
});

// 添加请求拦截器
ajax.interceptors.request.use(function (config) {
  // 请求成功执行的回调函数
  // config是包含这次请求的所有信息的一个对象
  // 开启进度条
  // 之后如果请求要增加一些公共参数 可以在这增加
  // 这个名字不能乱写，因为后端只会处理这个信息
  config.headers.userTempId = getUserTempId();
  // 用户登录后需要增加token(用户的真正标识)
  // 对于临时身份标识而言 是咱们前端自己生成的始终存在
  // 对于token而言，是后端给咱们前端使用的东西，登录后才有token
  let token = store.state.user.token;
  if (token) {
    config.headers.token = token;
  }
  Nprogress.start();
  return config;
});

// 添加响应拦截器
ajax.interceptors.response.use(
  function (response) {
    // 响应成功执行的回调函数
    // response是这次响应所有信息组成的一个对象(响应报文)
    // console.log(response,'response')
    // 关闭进度条
    Nprogress.done();
    return response.data;
  },
  function (error) {
    // 响应失败执行的回调函数
    // 之后咱们在这里统一处理所有错误 根据请求回来的状态码进行统一处理
    // 关闭进度条
    Nprogress.done();
    if (error.response.status === 401) {
      alert("未授权");
    } else if (error.response.status === 403) {
      alert("禁止访问");
    } else if (error.response.status === 404) {
      alert("错误访问");
    } else if (error.response.status === 500) {
      alert("服务器出错");
    }
    // 咱们之后不在组件中处理错误了
    return new Promise(() => {}); //返回一个pending状态的promise
  }
);

export default ajax;
